{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 在许多情况下，训练集和测试集并不来自同一个分布。这就是所谓的分布偏移。\n",
    "* 真实风险是从真实分布中抽取的所有数据的总体损失的预期。然而，这个数据总体通常是无法获得的。经验风险是训练数据的平均损失，用于近似真实风险。在实践中，我们进行经验风险最小化。\n",
    "* 在相应的假设条件下，可以在测试时检测并纠正协变量偏移和标签偏移。在测试时，不考虑这种偏移可能会成为问题。\n",
    "* 在某些情况下，环境可能会记住自动操作并以令人惊讶的方式做出响应。在构建模型时，我们必须考虑到这种可能性，并继续监控实时系统，并对我们的模型和环境以意想不到的方式纠缠在一起的可能性持开放态度。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "os.environ[\"KMP_DUPLICATE_LIB_OK\"]=\"TRUE\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4.9.1 分布偏移的类型"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "一个二元分类问题：区分狗和猫。\n",
    "如果分布可以以任意方式偏移，那么我们的情景允许病态的情况，\n",
    "即输入的分布保持不变：$p_S(x) = p_T(x)$，\n",
    "但标签全部翻转：$p_S(y | x) = 1 - p_T(y | x)$。\n",
    "换言之，如果将来所有的“猫”现在都是狗，而我们以前所说的“狗”现在是猫。\n",
    "而此时输入$p(x)$的分布没有任何改变，"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 协变量偏移"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "假设：虽然输入的分布可能随时间而改变，\n",
    "但标签函数（即条件分布$P(y \\mid x)$）没有改变。\n",
    "统计学家称之为协变量偏移\n",
    "。因为这个问题是由于协变量分布的变化而产生的。\n",
    "虽然有时我们可以在不引用因果关系的情况下对分布偏移进行推断，\n",
    "但在我们认为$x$导致$y$的情况下，协变量偏移是一种自然假设。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 标签偏移"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "标签偏移描述了与协变量偏移相反的问题。\n",
    "这里我们假设标签边缘概率$P(y)$可以改变，\n",
    "但是类别条件分布$P(x \\mid y)$在不同的领域之间保持不变。\n",
    "当我们认为$y$导致$x$时，标签偏移是一个合理的假设。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 概念偏移"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "当标签的定义发生变化时，就会出现这种问题。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4.9.3 分布偏移纠正"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 经验风险与实际风险"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "训练数据$\\{(x_1, y_1), \\ldots, (x_n, y_n)\\}$\n",
    "的特征和相关的标签经过迭代，在每一个小批量之后更新模型$f$的参数。\n",
    "为了简单起见，我们不考虑正则化，因此极大地降低了训练损失："
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$\\mathop{\\mathrm{minimize}}_f \\frac{1}{n} \\sum_{i=1}^n l(f(x_i), y_i),$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "其中$l$是损失函数，用来度量：给定标签$y_i$，预测$f(x_i)$的“糟糕程度”。这一项成为经验风险，经验风险是为了近似真实风险，整个训练数据上的平均损失，即从其真实分布$p(x,y)$中抽取的所有数据的总体损失的期望值："
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$E_{p(x, y)} [l(f(x), y)] = \\int\\int l(f(x), y) p(x, y) \\;dxdy.$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 协变量偏移纠正"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "假设对于带标签的数据$(x_i, y_i)$，\n",
    "我们要评估$P(y \\mid x)$。\n",
    "然而观测值$x_i$是从某些*源分布*$q(x)$中得出的，\n",
    "而不是从目标分布$p(x)$中得出的。\n",
    "幸运的是，依赖性假设意味着条件分布保持不变，即：\n",
    "$p(y \\mid x) = q(y \\mid x)$。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$\n",
    "\\begin{aligned}\n",
    "\\int\\int l(f(x), y) p(y \\mid x)p(x) \\;dxdy =\n",
    "\\int\\int l(f(x), y) q(y \\mid x)q(x)\\frac{p(x)}{q(x)} \\;dxdy.\n",
    "\\end{aligned}\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们需要根据数据来自正确分布与来自错误分布的概率之比，\n",
    "来重新衡量每个数据样本的权重："
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$\\beta_i \\stackrel{\\mathrm{def}}{=} \\frac{p(x_i)}{q(x_i)}.$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "将权重$\\beta_i$代入到每个数据样本$(x_i, y_i)$中，\n",
    "我们可以使用”加权经验风险最小化“来训练模型："
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$\\mathop{\\mathrm{minimize}}_f \\frac{1}{n} \\sum_{i=1}^n \\beta_i l(f(x_i), y_i).$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "估计$\\beta_i$这个比率使用逻辑斯谛回归，这是用于二元分类的$softmax$回归,我们学习了一个分类器来区分从$p(x)$抽取的数据和从$q(x)$抽取的数据。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "假设我们分别从$p(x)$和$q(x)$两个分布中抽取相同数量的样本。现在用$z$标签表示：从$p$抽取的数据为$1$，从$q$抽取的数据为$-1$。然后，混合数据集中的概率由下式给出:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$P(z=1 \\mid x) = \\frac{p(x)}{p(x)+q(x)} \\text{ and hence } \\frac{P(z=1 \\mid x)}{P(z=-1 \\mid x)} = \\frac{p(x)}{q(x)}.$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们使用对数几率回归方法，其中\n",
    "$P(z=1 \\mid x)=\\frac{1}{1+\\exp(-h(x))}$,$h$是一个参数化函数，则有："
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$\n",
    "\\beta_i = \\frac{1/(1 + \\exp(-h(x_i)))}{\\exp(-h(x_i))/(1 + \\exp(-h(x_i)))} = \\exp(h(x_i)).\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们需要解决两个问题：\n",
    "* 第一个问题是关于区分来自两个分布的数据；\n",
    "* 第二个问题是关于加权经验风险的最小化问题。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "整的协变量偏移纠正算法。\n",
    "假设我们有一个训练集$\\{(x_1, y_1), \\ldots, (x_n, y_n)\\}$\n",
    "和一个未标记的测试集$\\{u_1, \\ldots, u_m\\}$。\n",
    "对于协变量偏移，我们假设$1 \\leq i \\leq n$的$x_i$来自某个源分布，\n",
    "$u_i$来自目标分布。以下是纠正协变量偏移的典型算法："
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1. 生成一个二元分类训练集：$\\{(x_1, -1), \\ldots, (x_n, -1), (u_1, 1), \\ldots, (u_m, 1)\\}$。\n",
    "1. 用对数几率回归训练二元分类器得到函数$h$。\n",
    "1. 使用$\\beta_i = \\exp(h(x_i))$或更好的$\\beta_i = \\min(\\exp(h(x_i)), c)$（$c$为常量）对训练数据进行加权。\n",
    "2. 使用权重$\\beta_i$进行$\\{(x_1, y_1), \\ldots, (x_n, y_n)\\}$的训练。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "如果我们找到$p(x) > 0$但$q(x) = 0$的点，\n",
    "那么相应的重要性权重会是无穷大。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 标签偏移纠正"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "假设我们处理的是$k$个类别的分类任务。$q$和$p$中分别是源分布和目标分布。假设标签的分布随时间变化：$q(y) \\neq p(y)$，但类别条件分布保持不变：$q(x \\mid y)=p(x \\mid y)$。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们可以根据定义的真实风险中的恒等式进行更正："
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$\n",
    "\\begin{aligned}\n",
    "\\int\\int l(f(x), y) p(x \\mid y)p(y) \\;dxdy =\n",
    "\\int\\int l(f(x), y) q(x \\mid y)q(y)\\frac{p(y)}{q(y)} \\;dxdy.\n",
    "\\end{aligned}\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "重要性权重将对应于标签似然比率"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$\\beta_i \\stackrel{\\mathrm{def}}{=} \\frac{p(y_i)}{q(y_i)}.$$\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "为了估计目标标签分布，我们首先采用性能相当好的现成的分类器，并使用验证集（也来自训练分布）计算其混淆矩阵。\n",
    "混淆矩阵$C$是一个$k \\times k$矩阵，\n",
    "其中每列对应于标签类别，每行对应于模型的预测类别。\n",
    "每个单元格的值$c_{ij}$是验证集中，真实标签为$j$，\n",
    "而我们的模型预测为$i$的样本数量所占的比例。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "将所有模型在测试时的预测取平均数，\n",
    "得到平均模型输出$\\mu(\\hat{y}) \\in \\mathbb{R}^k$，\n",
    "其中第$i$个元素$\\mu(\\hat{y}_i)$是我们模型预测测试集中$i$的总预测分数。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "通过求解一个简单的线性系统来估计测试集的标签分布："
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$C p(y) = \\mu(\\hat{y}),$$\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "作为一个估计，$\\sum_{j=1}^k c_{ij} p(y_j) = \\mu(\\hat{y}_i)$\n",
    "对所有$1 \\leq i \\leq k$成立，\n",
    "其中$p(y_j)$是$k$维标签分布向量$p(y)$的第$j^\\mathrm{th}$元素。\n",
    "如果我们的分类器一开始就足够精确，那么混淆矩阵$C$将是可逆的，\n",
    "进而我们可以得到一个解$p(y) = C^{-1} \\mu(\\hat{y})$。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "对于标签为$y_i$的任何训练样本$i$，\n",
    "我们可以使用我们估计的$p(y_i)/q(y_i)$比率来计算权重$\\beta_i$，并将其代入加权经验风险最小化中。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 概念偏移纠正"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "使用新数据更新现有的网络权重，而不是从头开始训练。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4.9.4 学习问题的分类法"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 批量学习"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在批量学习中，我们可以访问一组训练特征和标签\n",
    "$\\{(x_1, y_1), \\ldots, (x_n, y_n)\\}$，\n",
    "我们使用这些特性和标签训练$f(x)$。部署此模型来对来自同一分布的新数据$(x, y)$进行评分。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 在线学习"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "单个“在线”学习数据$(x_i, y_i)$,在这个循环中，给定新的观测结果，我们会不断地改进我们的模型。:\n",
    "* 观测到$x_i$\n",
    "* 得出一个估计值$f(x_i)$\n",
    "在在线学习中，我们有以下的循环。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$\n",
    "\\mathrm{model} ~ f_t \\longrightarrow\n",
    "\\mathrm{data} ~ x_t \\longrightarrow\n",
    "\\mathrm{estimate} ~ f_t(x_t) \\longrightarrow\n",
    "\\mathrm{observation} ~ y_t \\longrightarrow\n",
    "\\mathrm{loss} ~ l(y_t, f_t(x_t)) \\longrightarrow\n",
    "\\mathrm{model} ~ f_{t+1}\n",
    "$$\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 老虎机"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "大多数学习问题中，我们有一个连续参数化的函数$f$。\n",
    "但在一个老虎机问题中，我们只有有限数量的手臂可以拉动。\n",
    "也就是说，我们可以采取的行动是有限的。\n",
    "对于这个更简单的问题，可以获得更强的最优性理论保证，"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 控制"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在很多情况下，环境会记住我们所做的事。\n",
    "不一定是以一种对抗的方式，但它会记住，而且它的反应将取决于之前发生的事情。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 强化学习"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "强调如何基于环境而行动，以取得最大化的预期利益。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 考虑到环境"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "上述不同情况之间的一个关键区别是：\n",
    "在静止环境中可能一直有效的相同策略，\n",
    "在环境能够改变的情况下可能不会始终有效。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* 在许多情况下，训练集和测试集并不来自同一个分布。这就是所谓的分布偏移。\n",
    "* 真实风险是从真实分布中抽取的所有数据的总体损失的预期。然而，这个数据总体通常是无法获得的。经验风险是训练数据的平均损失，用于近似真实风险。在实践中，我们进行经验风险最小化。\n",
    "* 在相应的假设条件下，可以在测试时检测并纠正协变量偏移和标签偏移。在测试时，不考虑这种偏移可能会成为问题。\n",
    "* 在某些情况下，环境可能会记住自动操作并以令人惊讶的方式做出响应。在构建模型时，我们必须考虑到这种可能性，并继续监控实时系统，并对我们的模型和环境以意想不到的方式纠缠在一起的可能性持开放态度。\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "test",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
